home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Tech Arsenal 1
/
Tech Arsenal (Arsenal Computer).ISO
/
tek-01
/
dkbuts.zip
/
TCE.BAS
< prev
next >
Wrap
BASIC Source File
|
1991-05-16
|
25KB
|
781 lines
'*****************
' Filename: TCE.BAS (The Color Editor)
' Function: Edit/Create DKB Color declarations.
' Written by: Dan Farmer
' Date: 03/26/91
' Version 1.0
' NOTES:
' Color 0 (background color) is set to mid-gray for use by gui-panels.
' Color displayed in sample window is palette index #1.
' Colors 17 - 255 used for the preview sphere gradient and are re-set when
' previewing.
'--------------------------------------------
' Revision History: (Who, when, what)
' 03/26/91 DFM Original release.
'---------------------------------
' 04/03/91 DMF Make.Gradient.Palette(): Better palette scaling.
' Sphere() : Use PSET instead of LINE for background of view.
' "Seamless paper" backdrop for view.
'
' 04/04/91 DMF Draw the preview sphere only once and keep it on the scren,
' "P"review now only updates the palette. Faster, plus you
' can compare two colors on screen at once. Wish I could
' page-flip in mode 13 and draw it "in the dark".
'
' 04/10/91 DMF -Load full filename from commandline instead of just path
' to it. DKB2.10 calls the color file COLORS.DAT rather
' than COLOR.DAT. User may have other color files, too!
' -Ability to specify input and output filenames. Also
' now prompts for input filename if none given at loadtime.
'
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
'' Conversion notes: ''
'' DEFINT means any untyped variable defaults to INT ''
'' GET #1,,IN$ means get from file #1 into IN$ for a length''
'' of however big IN$ already is. ''
'' COMMAND$ is the command line less the program name. Just''
'' rewrite the lousy BASIC interpretation of parameters.''
'' Type ! is a float, & is a long int, # is an 8-byte float''
'' STRING$(n,c) function returns a string containing 'n' ''
'' occurances of the character 'c'. ''
'' FUNCTION returns a value. SUB doesn't (void) ''
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
OPTION BASE 1 ' Set default lowest bound for arrays to 1
DECLARE FUNCTION Color.Set.Shade& (red!, green!, blue!)
DECLARE SUB Color.Set.And.Show.Current (red!, green!, blue!)
DECLARE SUB Color.Set.Values (Amount!, hue!)
DECLARE SUB Color.Clear.Values (value!, red!, green!, blue!)
DECLARE SUB Color.Write.Data (ColorName$, red!, green!, blue!, recno, Reccount, ColorBuffer$())
DECLARE SUB Color.Load.Color.File (Reccount!, recno!)
DECLARE SUB Color.Parse.Color.File (a$, Buffer$(), recno!)
DECLARE SUB Color.Convert.Color.Data (recno!, Buffer$(), red!, green!, blue!)
DECLARE SUB Color.Make.Gradient.Palette (red!, green!, blue!)
DECLARE SUB Color.Preview.Sphere (Xc%, Yc%, Radius!, red!, green!, blue!)
DECLARE SUB Gui.Clear.Msg (AtRow!)
DECLARE SUB Gui.KbGet (a$)
DECLARE SUB Gui.Center.Msg (AtRow, a$)
DECLARE SUB Gui.CapsState ()
DECLARE SUB Gui.Panel (WinLeft%, WinTop%, WinRight%, WinBottom%, Depth%)
DECLARE SUB Gui.Screen.Init ()
DECLARE SUB Gui.Waitkey ()
DECLARE SUB Chime.Friendly ()
DECLARE SUB Chime.Warning ()
COMMON SHARED FileName$
COMMON SHARED Input.File$, Output.File$, Input.File.Handle, Output.File.Handle
COMMON SHARED ESC$, CursorUp$, CursorDown$
COMMON SHARED Reccount, recno
COMMON SHARED MoreRedButton%, MoreGreenButton%, MoreBlueButton%
COMMON SHARED LessRedButton%, LessGreenButton%, LessBlueButton%
COMMON SHARED BrightenButton%, DarkenButton%, PreviewButton%, SaveButton%
COMMON SHARED ClearButton%, InOutButton%
COMMON SHARED Good.Input.File$
CONST FALSE = 0, TRUE = NOT FALSE
CONST MAXRECS = 512 ' Way more than enough
ESC$ = CHR$(27)
F1$ = CHR$(0) + CHR$(59)
CursorUp$ = CHR$(0) + CHR$(72)
CursorDown$ = CHR$(0) + CHR$(80)
' ColorBuffer$: Element #1:= Color Name$ #2:= red$ #3:= green$ #4:=blue$
DIM SHARED ColorBuffer$(MAXRECS, 4)
CONST Color.Values.Row = 2
CONST Color.Name.Row = 12
' Flags for gui-button status
MoreRedButton% = 1: MoreGreenButton% = 1: MoreBlueButton% = 1
LessRedButton% = 1: LessGreenButton% = 1: LessBlueButton% = 1
BrightenButton% = 1: DarkenButton% = 1: PreviewButton% = 1: SaveButton% = 1
ClearButton% = 1: InOutButton% = 1
' Find override color file dir/name
FileName$ = COMMAND$ ' Check argv first
IF FileName$ = "" THEN FileName$ = ENVIRON$("DKB") ' Check environ variable
IF FileName$ = "" THEN FileName$ = "COLORS.DAT" ' Use default
Input.File$ = FileName$
Output.File$ = FileName$ ' May be changed by user
Input.File.Handle = 1
Output.File.Handle = 2
Reccount = 0 ' Number of "records" in color buffer
recno = 0 ' Index pointer to current color in buffer
incr = .01 ' Color increment rate. Toggles to 0.10
MAIN:
CALL Gui.Screen.Init
' --- Load COLOR.DAT file into memory (ColorBuffer$)
CALL Color.Load.Color.File(Reccount, recno) '
' --- Convert rgb into long int
CALL Color.Convert.Color.Data(recno, ColorBuffer$(), red!, green!, blue!)
Msg$ = ColorBuffer$(recno, 1)
DO ' Loop unit ESC$
GOSUB Screen.Freshen
CALL Gui.KbGet(a$)
CALL Gui.Clear.Msg(12)
SELECT CASE a$
' --- Cursor Up/Down picks next/prev COLORS.DAT color.
' Other keys affect the color displayed currently.
CASE CursorDown$
recno = recno + 1: IF recno > Reccount THEN recno = 1
CALL Color.Convert.Color.Data(recno, ColorBuffer$(), red!, green!, blue!)
Msg$ = ColorBuffer$(recno, 1)
CASE CursorUp$
recno = recno - 1: IF recno < 1 THEN recno = Reccount
CALL Color.Convert.Color.Data(recno, ColorBuffer$(), red!, green!, blue!)
Msg$ = ColorBuffer$(recno, 1)
CASE "+", "="
IF incr = .01 THEN incr = .1 ELSE incr = .01 'Toggle increment
CASE "R"
IF red! < 1 THEN
Msg$ = "Increasing Red"
CALL Color.Set.Values(incr, red!)
MoreRedButton% = -1: LessRedButton% = 1
ELSE
CALL Chime.Friendly
Msg$ = "Max Red!"
END IF
CASE "r"
IF red! > 0 THEN
Msg$ = "Decreasing Red"
CALL Color.Set.Values(-incr, red!)
LessRedButton% = -1: MoreRedButton% = 1
ELSE
CALL Chime.Friendly
Msg$ = "Red is zero!"
END IF
CASE "G"
IF green! < 1 THEN
Msg$ = "Increasing Green"
CALL Color.Set.Values(incr, green!)
MoreGreenButton% = -1: LessGreenButton% = 1
ELSE
CALL Chime.Friendly
Msg$ = "Max Green!"
END IF
CASE "g"
IF green! > 0 THEN
Msg$ = "Decreasing Green"
CALL Color.Set.Values(-incr, green!)
LessGreenButton% = -1: MoreGreenButton% = 1
ELSE
CALL Chime.Friendly
Msg$ = "Green is zero!"
END IF
CASE "B"
IF blue! < 1 THEN
Msg$ = "Increasing Blue"
CALL Color.Set.Values(incr, blue!)
MoreBlueButton% = -1: LessBlueButton% = 1
ELSE
CALL Chime.Friendly
Msg$ = "Max Blue!"
END IF
CASE "b"
IF blue! > 0 THEN
Msg$ = "Decreasing Blue"
CALL Color.Set.Values(-incr, blue!)
LessBlueButton% = -1: MoreBlueButton% = 1
ELSE
CALL Chime.Friendly
Msg$ = "Blue is zero!"
END IF
CASE "L", "l"
IF red! = 1 AND green! = 1 AND blue! = 1 THEN
Msg$ = "Can't brighten WHITE!"
CALL Chime.Warning
ELSE
BrightenButton% = -1
Msg$ = "Lightening Hue"
IF red! < 1 THEN CALL Color.Set.Values(incr, red!)
IF green! < 1 THEN CALL Color.Set.Values(incr, green!)
IF blue! < 1 THEN CALL Color.Set.Values(incr, blue!)
END IF
CASE "D", "d"
IF red! = 0 AND green! = 0 AND blue = 0 THEN
Msg$ = "Can't darken BLACK!"
CALL Chime.Warning
ELSE
DarkenButton% = -1
Msg$ = "Darkening Hue"
IF red! > 0 THEN CALL Color.Set.Values(-incr, red!)
IF green! > 0 THEN CALL Color.Set.Values(-incr, green!)
IF blue! > 0 THEN CALL Color.Set.Values(-incr, blue!)
END IF
CASE "C", "c"
Saved.Msg$ = Msg$
ClearButton% = -1
Msg$ = "[W]hite, [G]ray, or [B]lack?"
GOSUB Screen.Freshen
a$ = ""
WHILE a$ = "": a$ = INKEY$: WEND
IF INSTR("Ww", a$) THEN
CALL Color.Clear.Values(1!, red!, green!, blue!)
Msg2$ = "White"
ELSEIF INSTR("Gg", a$) THEN
CALL Color.Clear.Values(.5, red!, green!, blue!)
Msg2$ = "Middle Gray"
ELSEIF INSTR("Bb", a$) THEN
CALL Color.Clear.Values(0!, red!, green!, blue!)
Msg2$ = "Black"
ELSE
Msg2$ = Saved.Msg$
END IF
Msg$ = "": GOSUB Screen.Freshen
Msg$ = Msg2$: GOSUB Screen.Freshen: Msg2$ = ""
CASE "S", "s", "W", "w"
Old.Color.Name$ = Msg$
SaveButton% = -1: Msg$ = "": GOSUB Screen.Freshen
CALL Gui.Center.Msg(12, "Color name:" + SPACE$(20))
LOCATE 12, POS(0) - 20
LINE INPUT Color.Name$
CALL Color.Write.Data(Color.Name$, red!, green!, blue!, recno, Reccount, ColorBuffer$())
CALL Gui.Clear.Msg(12)
IF LTRIM$(Color.Name$) = "" THEN Color.Name$ = Old.Color.Name$
Msg$ = Color.Name$
CASE "V", "v", "P", "p"
PreviewButton% = -1
CALL Color.Make.Gradient.Palette(red!, green!, blue!)
CASE "F", "f", "I", "i"
InOutButton% = -1
Saved.Msg$ = Msg$
Msg$ = "[I]nput or [O]utput file?"
GOSUB Screen.Freshen
a$ = ""
WHILE a$ = "": a$ = INKEY$: WEND
CALL Gui.Clear.Msg(12)
IF INSTR("Ii", a$) THEN ' Input file
' The ON ERROR handler in Color.Load.Color.File will ask for
' a new filename if passed a bad one.
Input.File$ = " "
Reccount = 0
recno = 0
CALL Color.Load.Color.File(Reccount, recno)
CALL Gui.Clear.Msg(12)
ELSEIF INSTR("Oo", a$) THEN ' Output file
InOutButton% = -1
CALL Gui.Center.Msg(12, "Output file:" + SPACE$(20))
LOCATE 12, POS(0) - 20
' Output file is always closed except when writing to it
' so there's no need to open it now. Just get the name.
LINE INPUT Output.File$
CALL Gui.Clear.Msg(12)
ELSE
Msg2$ = Saved.Msg$
END IF
Msg$ = "": GOSUB Screen.Freshen
Msg$ = Msg2$: GOSUB Screen.Freshen: Msg2$ = ""
CASE ESC$
' DON'T BEEP
CASE ELSE
Msg$ = "Invalid keypress"
CALL Chime.Warning
END SELECT
LOOP WHILE a$ <> ESC$
END.PROGRAM:
SCREEN 0: WIDTH 80: CLS
LOCATE 10, 1
PRINT " ┌─Thank you for using───────────┐"
PRINT " │ TCE: The Color Editor │"
PRINT " │ Copyright By Dan Farmer, 1991 │"
PRINT " │ All rights reserved. │"
PRINT " └───────────────────────────────┘"
END
'--------------------------- end of main ------------------------------------
' --- Repaint the screen, update button status, show current color in window.
Screen.Freshen:
COLOR 8
LOCATE 22, 11: PRINT "TCE:The Color Editor"
' --- Little "wings" logo (BirdWARE logo?)
LogoColors: DATA 4,2,3
RESTORE LogoColors
FOR i% = 2 TO 6 STEP 2
READ a
LINE (46 + i% * 2, 168 + i%)-(73, 168 + i%), a
LINE (246, 168 + i%)-(273 - i% * 2, 168 + i%), a
NEXT i%
CALL Gui.Panel(148, 182, 234, 192, 1) ' ESC to quit message panel
COLOR 8
LOCATE 24, 20: PRINT "[ESC] Quit";
LOCATE 24, 36: IF incr = .1 THEN PRINT "Fast"; ELSE PRINT "Slow";
' --- Display Message in color name window
CALL Gui.Center.Msg(12, Msg$)
'--- "Radio Buttons"
' --- Left side, Left column
CALL Gui.Panel(13, 101, 40, 113, MoreRedButton%)
COLOR 4
LOCATE 14, 3: PRINT "R"; ' chr(24)
CALL Gui.Panel(13, 117, 40, 129, MoreGreenButton%)
COLOR 2
LOCATE 16, 3: PRINT "G";
CALL Gui.Panel(13, 133, 40, 145, MoreBlueButton%)
COLOR 3
LOCATE 18, 3: PRINT "B";
CALL Gui.Panel(13, 149, 40, 161, BrightenButton%)
COLOR 8
LOCATE 20, 3: PRINT "Ltn"; ' chr(18)
' --- Left side, Right column
CALL Gui.Panel(46, 101, 73, 113, LessRedButton%)
COLOR 4
LOCATE 14, 7: PRINT "r"; ' chr(25)
CALL Gui.Panel(46, 117, 73, 129, LessGreenButton%)
COLOR 2
LOCATE 16, 7: PRINT "g";
CALL Gui.Panel(46, 133, 73, 145, LessBlueButton%)
COLOR 3
LOCATE 18, 7: PRINT "b";
CALL Gui.Panel(46, 149, 73, 161, DarkenButton%)
COLOR 8
LOCATE 20, 7: PRINT "Dkn";
COLOR 8
' --- Right side
CALL Gui.Panel(246, 101, 306, 113, PreviewButton%)
LOCATE 14, 32: PRINT "Preview"
CALL Gui.Panel(246, 117, 306, 129, SaveButton%)
LOCATE 16, 32: PRINT "Save"
CALL Gui.Panel(246, 133, 306, 145, ClearButton%)
LOCATE 18, 32: PRINT "Clear";
COLOR 7
CALL Color.Set.And.Show.Current(red!, green!, blue!) ' Show the color
RETURN
' ---- Called if color file not found or user pressed "F"ile / "I"nput file.
GetInputFile:
COLOR 8
CLOSE #Input.File.Handle ' Avoid "file already open"
CALL Gui.Center.Msg(12, "Input file:" + SPACE$(20))
LOCATE 12, POS(0) - 20 ' Backspace for input
LINE INPUT Input.File$ ' Get filename from user
Reccount = 0 ' Reset counters
recno = 0
CALL Gui.Clear.Msg(12)
IF Input.File$ = "" THEN
IF Good.Input.File$ = "" THEN
CLS : WIDTH 80: PRINT : PRINT
PRINT "TCE Error: Input filename not specified."
PRINT " Useage : TCE d:\path\filename.ext"
PRINT " or: SET DKB=d:\path\filename.ext"
PRINT " where filename is your DKB color file."
PRINT
SYSTEM
ELSE
Input.File$ = Good.Input.File$ 'resort to last good filename
RESUME
END IF
ELSE
RESUME
END IF
RETURN
SUB Chime.Friendly
SOUND 1500, .1
SOUND 3000, .1
END SUB
SUB Chime.Warning
' SOUND 40, 3
END SUB
' --- Reset all RGB values to zero
SUB Color.Clear.Values (value!, red!, green!, blue!) STATIC
red! = value!: green! = value!: blue! = value!
END SUB
' --- Convert values in color buffer to rgb floats
SUB Color.Convert.Color.Data (recno, Buffer$(), red!, green!, blue!) STATIC
red! = VAL(Buffer$(recno, 2))
green! = VAL(Buffer$(recno, 3))
blue! = VAL(Buffer$(recno, 4))
END SUB
' --- Load COLORS.DAT into a buffer.
' Requires COMMON input.file.handle,input.file$
' and CONST MAXRECS
SUB Color.Load.Color.File (Reccount, recno) STATIC
STATIC Work$
CLOSE #Input.File.Handle
ON ERROR GOTO GetInputFile
OPEN Input.File$ FOR INPUT AS #Input.File.Handle
ON ERROR GOTO 0 ' This clears the ON ERROR event driver
Good.Input.File$ = Input.File$
' Since COLOR.DAT is composed of variable-length records, RANDOM file access
' is not workable, so let's fake it with an array.
recno = 1
' Sample Line = "DECLARE White = COLOUR RED 1.0 GREEN 1.0 BLUE 1.0"
DO WHILE NOT EOF(Input.File.Handle)
INPUT #Input.File.Handle, Work$ ' read in one line as a string
CALL Color.Parse.Color.File(LTRIM$(Work$), ColorBuffer$(), recno)
LOOP
CLOSE #Input.File.Handle
Reccount = recno - 1
recno = 1
END SUB
' --- This routine probably needs some work. Aaron says to look at his
' hsv_to_rgb routine in the DKB imb.c code.
' What I am *trying* to do is make a dark-to-light gradient for the
' current color. This is then used to paint the preview image.
SUB Color.Make.Gradient.Palette (red!, green!, blue!) STATIC
STATIC red2!, green2!, blue2!
ambient = .25
diffuse = 1 - ambient
MAXCOLORS = 255
COLOROFFSET = 17
numcolors = MAXCOLORS - COLOROFFSET
red.scale = red! + diffuse
green.scale = green! + diffuse
blue.scale = blue! + diffuse
redincr! = red! / numcolors * red.scale
greenincr! = green! / numcolors * green.scale
blueincr! = blue! / numcolors * blue.scale
red2! = ambient + redincr!: green2! = ambient + greenincr!: blue2! = ambient + blueincr!
' Set pallette indices 17 - 255 from dark hue to bright hue
FOR i% = 1 TO numcolors
PALETTE COLOROFFSET + i%, Color.Set.Shade&(red2!, green2!, blue2!)
CALL Color.Set.Values(redincr!, red2!)
CALL Color.Set.Values(greenincr!, green2!)
CALL Color.Set.Values(blueincr!, blue2)
NEXT i%
END SUB
SUB Color.Parse.Color.File (a$, Buffer$(), recno) STATIC
STATIC red$, green$, blue$, IsRed, IsGreen, IsBlue, ColorName$, EqualSign
IF INSTR(a$, "DECLARE") THEN
a$ = LTRIM$(RTRIM$(MID$(a$, 8))) ' strip the DECLARE
ColorName$ = LTRIM$(RTRIM$(MID$(a$, 8))) ' parse the name
EqualSign = INSTR(a$, "=")
ColorName$ = LTRIM$(RTRIM$(LEFT$(a$, EqualSign - 1)))
Buffer$(recno, 1) = ColorName$ ' put name in buffer
IsRed = INSTR(a$, "RED") ' parse RED value
IF IsRed THEN
red$ = MID$(a$, IsRed + 4)
ELSE
red$ = "0.0"
END IF
Buffer$(recno, 2) = red$
IsGreen = INSTR(a$, "GREEN") ' parse GREEN value
IF IsGreen THEN
green$ = MID$(a$, IsGreen + 6)
ELSE
green$ = "0.0"
END IF
Buffer$(recno, 3) = green$
IsBlue = INSTR(a$, "BLUE") ' parse BLUE value
IF IsBlue THEN
blue$ = MID$(a$, IsBlue + 5)
ELSE
blue$ = "0.0"
END IF
Buffer$(recno, 4) = blue$
recno = recno + 1 ' increment record#
END IF
END SUB
SUB Color.Preview.Sphere (Xc%, Yc%, Radius!, red!, green!, blue!) STATIC
' Gui Panel parms := " Left, Top, Right, Bottom, +/-Depth
CALL Gui.Panel(80, 101, 240, 161, -2) ' Make a viewing window
CALL Color.Make.Gradient.Palette(red!, green!, blue!)
' --- Draw sky and a shaded floor
horizon% = 120
FOR y% = 103 TO 159
FOR x% = 82 TO 238
IF y% < horizon% THEN
PSET (x%, y%), 119 ' mid-range "sky" (our actual color)
ELSE
PSET (x%, y%), 16 + (y% - horizon%) * 3
END IF
NEXT x%
NEXT y%
' --- Note: The following two lines are NOT generic. They are
' hard-coded by trial and error for correct placement. My
' Momma taught me better- she really did!
' --- Draw a projected shadow
ambient = 40
CIRCLE (Xc% + 10, Yc% + Radius! * .52), Radius!, ambient, , , .3
PAINT (Xc% + 10, Yc% + Radius! * .52), ambient
' --- Draw a shaded Color.Preview.Sphere by reducing the radius of and
' moving the center of a filled circle while cycling the palette
' from dark to light.
BStep! = 0
FOR i% = 1 TO 238
kolor% = i% + 20 ' Skip reserved colors & darkest 4
IF kolor% > 255 THEN kolor% = 255 'cause I screw up!
Radius! = Radius! - .12: IF Radius! < 1 THEN Radius! = 1
BStep! = BStep! + .06 ' offsets the next circle x & y
x% = Xc% - BStep! / 1.75 ' shift the hilight left
y% = Yc% - BStep! ' shift the hilight upwards
CIRCLE (x%, y%), Radius!, kolor%
PAINT (x%, y%), kolor%
NEXT i%
END SUB
' --- Display a box filled with the current hue
' Requires PUBLIC CONSTANT named Color.Values.Row (could be hard-coded)
' Sets Pallette index 1
SUB Color.Set.And.Show.Current (red!, green!, blue!) STATIC
PALETTE 1, Color.Set.Shade&(red!, green!, blue!)
LINE (7, 26)-(313, 70), 1, BF ' Filled box
' --- Display current RGB values
COLOR 4
LOCATE Color.Values.Row, 3: PRINT USING "Red: #.##"; red!
COLOR 2
LOCATE Color.Values.Row, 15: PRINT USING "Green: #.##"; green!
COLOR 3
LOCATE Color.Values.Row, 29: PRINT USING "Blue: #.##"; blue!
COLOR 8
END SUB
' --- Create a LONG INT color value for pallette set from rgb components
FUNCTION Color.Set.Shade& (red!, green!, blue!) STATIC
r& = red! * 63!
g& = green! * 63!
B& = blue! * 63!
Color.Set.Shade& = r& + g& * 256& + B& * 65536
END FUNCTION
' Increase or decrease hue value by specified amount.
SUB Color.Set.Values (Amount!, hue!) STATIC
Direction% = SGN(Amount!)
Amount! = ABS(Amount!)
IF Direction% = 1 THEN
hue! = hue! + Amount: IF hue! > 1! THEN hue! = 1!
ELSEIF Direction% = -1 THEN
hue! = hue! - Amount: IF hue! < 0! THEN hue! = 0!
END IF
hue$ = LTRIM$(STR$(hue!))
END SUB
' --- Prompt user for a descriptive color name and
' write out the color data, DKB style, to a filename, outfile$
' Requires CONSTANT named Filename.Row
' Requires COMMON SHARED named output.file.handle AND output.file$
'
SUB Color.Write.Data (ColorName$, red!, green!, blue!, recno, Reccount, Buffer$()) STATIC
IF ColorName$ <> "" THEN
OPEN Output.File$ FOR APPEND AS #Output.File.Handle
PRINT #Output.File.Handle, "DECLARE "; ColorName$; " = COLOUR";
PRINT #Output.File.Handle, USING " RED #.##"; red!;
PRINT #Output.File.Handle, USING " GREEN #.##"; green!;
PRINT #Output.File.Handle, USING " BLUE #.##"; blue!
CLOSE #Output.File.Handle
Reccount = Reccount + 1
recno = Reccount
Buffer$(Reccount, 1) = ColorName$
Buffer$(Reccount, 2) = LTRIM$(STR$(red!))
Buffer$(Reccount, 3) = LTRIM$(STR$(green!))
Buffer$(Reccount, 4) = LTRIM$(STR$(blue!))
CALL Chime.Friendly
END IF
END SUB
' --- Check status of caps-lock
' Requires PUBLIC CONSTANT named Prompt.Row (generally 24)
SUB Gui.CapsState STATIC
STATIC OldState, NewState, CapsOn
DEF SEG = 0 'Set data segment to low memory
OldState = CapsOn
CapsOn = (PEEK(&H417) AND 64)
NewState = CapsOn
IF OldState <> NewState OR NOT Called.Before THEN
IF CapsOn THEN
CALL Gui.Panel(6, 182, 40, 192, 1)
LOCATE 24, 2: PRINT "CAPS";
ELSE
CALL Gui.Panel(6, 182, 40, 192, -1)
LOCATE 24, 2: PRINT "caps";
END IF
END IF
DEF SEG 'Restore default data segment
' The following is, I believe, a BASIC only trick, since BASIC does not
' REQUIRE variable initializing. Of course, Called.Before *could* be
' defined as a COMMON SHARED variable and initialized to FALSE
' outside of this function, but why bother?
Called.Before = TRUE
END SUB
' --- Center a string on the current line
SUB Gui.Center.Msg (AtRow, a$) STATIC
IF a$ = "" THEN CALL Gui.Clear.Msg(AtRow): EXIT SUB
LeftTab% = 21 - LEN(a$) / 2
WLeft% = (LeftTab% * 8) - 12
WRight% = WLeft% + (LEN(a$) * 8) + 10
WTop% = AtRow * 8 - 12
WBottom% = WTop% + 14
CALL Gui.Panel(WLeft%, WTop%, WRight%, WBottom%, -1)
LOCATE AtRow, LeftTab%: PRINT a$;
END SUB
' --- Clear a line
SUB Gui.Clear.Msg (AtRow) STATIC
a$ = SPACE$(34)
LeftTab% = 21 - (LEN(a$) / 2)
WLeft% = LeftTab% * 8 - 12
WRight% = LEN(a$) * 8 + WLeft% + 4
WTop% = AtRow * 8 - 12
WBottom% = WTop% + 14
CALL Gui.Panel(WLeft%, WTop%, WRight%, WBottom%, 0)
LOCATE AtRow, LeftTab%: PRINT a$;
END SUB
'--- Read keybuffer and check caps lock state while waiting. Requires
'--- the subprogram Gui.CapsState().
SUB Gui.KbGet (a$) STATIC
a$ = ""
WHILE a$ = ""
a$ = INKEY$
CALL Gui.CapsState
WEND
END SUB
SUB Gui.Panel (WinLeft%, WinTop%, WinRight%, WinBottom%, Depth%) STATIC
STATIC i%
' Parameter Depth := -1 FOR INSET, 1 FOR OUTSET
' -2 FOR INSET 2 DEEP, 3 TO OUTSET 3 DEEP, ETC.
INSET% = (Depth% < 0)
Depth% = ABS(Depth%)
IF Depth% = 0 THEN
LINE (WinLeft% + 1, WinTop% - 1)-(WinRight% - 1, WinBottom% + 1), 7, BF
ELSE
FOR i% = 0 TO Depth% - 1
IF INSET% THEN ' INSET PANEL
LINE (WinLeft% + i%, WinTop% + i%)-(WinLeft% + i%, WinBottom% - i%), 8' LEFT SIDE
LINE (WinLeft% + i%, WinTop% + i%)-(WinRight% - i%, WinTop% + i%), 8 ' TOP LINE
LINE (WinLeft% + i%, WinBottom% - i%)-(WinRight% - i%, WinBottom% - i%), 15' BOTTOM LINE
LINE (WinRight% - i%, WinTop% + i%)-(WinRight% - i%, WinBottom% - i%), 15' RIGHT SIDE
ELSE ' OUTSET PANEL
LINE (WinLeft% + i%, WinTop% + i%)-(WinLeft% + i%, WinBottom% - i%), 15' LEFT SIDE
LINE (WinLeft% + i%, WinTop% + i%)-(WinRight% - i%, WinTop% + i%), 15 ' TOP LINE
LINE (WinLeft% + i%, WinBottom% - i%)-(WinRight% - i%, WinBottom% - i%), 8' BOTTOM LINE
LINE (WinRight% - i%, WinTop% + i%)-(WinRight% - i%, WinBottom% - i%), 8' RIGHT SIDE
END IF
NEXT i%
END IF
END SUB
SUB Gui.Screen.Init
CLS
' --- Init screen to graphics mode 13 (MCGA 320x200x256)
' Colorswitch on, Active Page 0, Visual Page 0
SCREEN 13, 1, 0, 0
PALETTE 0, Color.Set.Shade&(.66, .66, .66) ' Set background to color 7
' Gui.Panel Parameters: Left top right bottom Depth
CALL Gui.Panel(1, 1, 319, 198, 1) ' Border panel
CALL Gui.Panel(6, 5, 314, 18, -2) ' Color values window (Top line)
CALL Gui.Panel(6, 25, 314, 71, -1) ' Color display window
CALL Gui.Panel(6, 78, 314, 176, 1) ' Main panel (Help screen,view,etc)
' Useable text area inside lower panel : rows 14-22, cols 2-38
CALL Gui.Panel(60, 182, 138, 192, 1) ' File button
COLOR 8
LOCATE 24, 9: PRINT "[F]=Files";
COLOR 7
CALL Gui.Panel(278, 182, 314, 192, -1) ' Increment window, line 24
CALL Color.Preview.Sphere(160, 128, 25, .5, .5, .5)
END SUB
' --- Wait forever for a keypress
SUB Gui.Waitkey STATIC
CALL Gui.Panel(148, 182, 256, 192, 1) ' Press any key panel
COLOR 15
LOCATE 24, 20: PRINT "Press any key";
COLOR 8
a$ = ""
WHILE a$ = ""
CALL Gui.KbGet(a$) ' Check for keypress
WEND
CALL Gui.Panel(147, 182, 261, 192, 0) ' Erase panel
END SUB